package cn.jetpiece.cloud.dict.app.modular.dict.service;

import cn.jetpiece.cloud.dict.api.model.params.CreateCategoryParam;
import cn.jetpiece.cloud.dict.api.model.params.UpdateCategoryParam;
import cn.jetpiece.cloud.dict.api.model.result.CategoryResult;
import cn.jetpiece.cloud.dict.app.modular.dict.entity.Category;
import cn.jetpiece.cloud.model.exception.ServiceException;
import cn.jetpiece.cloud.model.model.TreeSelectModel;
import cn.jetpiece.cloud.model.response.Result;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author hancp
 * @version 1.0
 * @description: 分类字典
 * @date 2021-11-08 10:15:39
 */
public interface ICategoryService extends IService<Category> {

    /**
     * 根节点父ID的值
     */
    Long ROOT_PID_VALUE = 0L;

    void addSysCategory(CreateCategoryParam category);

    void updateSysCategory(UpdateCategoryParam category);

    /**
     * 根据父级编码加载分类字典的数据
     *
     * @param pcode
     * @return
     */
    List<TreeSelectModel> queryListByCode(String pcode) throws ServiceException;

    /**
     * 根据pid查询子节点集合
     *
     * @param pid
     * @return
     */
    List<TreeSelectModel> queryListByPid(Long pid);

    /**
     * 根据pid查询子节点集合,支持查询条件
     *
     * @param pid
     * @param condition
     * @return
     */
    List<TreeSelectModel> queryListByPid(Long pid, Map<String, String> condition);

    /**
     * 根据code查询id
     *
     * @param code
     * @return
     */
    Long queryIdByCode(String code);

    /**
     * 根据code查询thirdPartCode
     *
     * @param code
     * @return
     */
    String queryThirdPartCodeByCode(String code);

    /**
     * 删除节点时同时删除子节点及修改父级节点
     *
     * @param ids
     */
    void deleteSysCategory(String ids);

    /**
     * 获取默认规则分类，如果以及设置过规则，不在属于默认
     * @return
     */
    List<Category> queryDefaultRuleCategory(Long pid);

    /**
     * 获取当前节点的所有父节点信息
     * @param id
     * @return
     */
    List<Category> queryParentById(@Param("id") Long id);

    /**
     * 获取当前节点的所有父节点信息自定义规则信息
     * @param id
     * @return
     */
    List<CategoryResult> queryParentRuleById(@Param("id") Long id);

    Result<String> checkDuplicate(UpdateCategoryParam param);
    /**
     * 核对编码是否已经存在
     * @param code
     * @param id
     * @return
     */
    Result<String> checkCodeDuplicate(Long id,String code);

    /**
     * 通过ID获取所有的子分类信息
     * @param id
     * @param isContainSelf 是否包含自己 { {1:包含 0:不包含}}
     * @return
     */
    List<Category> queryAllChildrenByPid(Long id, Integer isContainSelf);

    /**
     * 启用/禁用 包含子类
     * @param id
     * @param flag  {1:启用 0:禁用}
     * @return
     */
    List<Long> setEnableFlag(String id, Integer flag);

}
